κ³ κΈ Python λλ²κΉ κΈ°λ²μ λ§μ€ν°νμ¬ λ³΅μ‘ν λ¬Έμ λ₯Ό ν¨μ¨μ μΌλ‘ ν΄κ²°νκ³ , μ½λ νμ§μ ν₯μμν€λ©°, μ μΈκ³ κ°λ°μμ μμ°μ±μ λμ΄μΈμ.
Python λλ²κΉ κΈ°λ²: κΈλ‘λ² κ°λ°μλ₯Ό μν κ³ κΈ λ¬Έμ ν΄κ²°
μννΈμ¨μ΄ κ°λ°μ μλμ μΈ μΈκ³μμ λ²κ·Έλ₯Ό λ°κ²¬νκ³ ν΄κ²°νλ κ²μ νΌν μ μλ κ³Όμ μ μΌλΆμ λλ€. κΈ°λ³Έμ μΈ λλ²κΉ μ λͺ¨λ Python κ°λ°μμκ² νμμ μΈ κΈ°μ μ΄μ§λ§, κ³ κΈ λ¬Έμ ν΄κ²° κΈ°λ²μ λ§μ€ν°νλ κ²μ 볡μ‘ν λ¬Έμ λ₯Ό ν΄κ²°νκ³ , μ±λ₯μ μ΅μ ννλ©°, κΆκ·Ήμ μΌλ‘ κΈλ‘λ² κ·λͺ¨μμ κ°λ ₯νκ³ μμ μ μΈ μ ν리μΌμ΄μ μ μ 곡νλ λ° λ§€μ° μ€μν©λλ€. μ΄ μ’ ν© κ°μ΄λλ λ€μν λ°°κ²½μ κ°λ°μκ° λμ± ν¨μ¨μ μ΄κ³ μ ννκ² λ¬Έμ λ₯Ό μ§λ¨νκ³ ν΄κ²°ν μ μλλ‘ μ§μνλ μ κ΅ν Python λλ²κΉ μ λ΅μ νꡬν©λλ€.
κ³ κΈ λλ²κΉ μ μ€μμ± μ΄ν΄
Python μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°νκ³ λ€μν νκ²½μ λ°°ν¬λ¨μ λ°λΌ λ²κ·Έμ μ±κ²©μ λ¨μν ꡬ문 μ€λ₯μμ 볡μ‘ν λ Όλ¦¬μ κ²°ν¨, λμμ± λ¬Έμ λλ 리μμ€ λμΆλ‘ λ°λ μ μμ΅λλ€. κ³ κΈ λλ²κΉ μ λ¨μν μ€λ₯λ₯Ό μΌμΌν€λ μ½λ μ€μ μ°Ύλ κ²μ λμ΄μλλ€. μ¬κΈ°μλ νλ‘κ·Έλ¨ μ€ν, λ©λͺ¨λ¦¬ κ΄λ¦¬ λ° μ±λ₯ λ³λͺ© νμμ λν λ κΉμ μ΄ν΄κ° ν¬ν¨λ©λλ€. νκ²½μ΄ ν¬κ² λ€λ₯΄κ³ νμ μ΄ μκ°λλ₯Ό μμ°λ₯΄λ κΈλ‘λ² κ°λ° νμκ²λ λλ²κΉ μ λν νμ€νλκ³ ν¨κ³Όμ μΈ μ κ·Ό λ°©μμ΄ κ°μ₯ μ€μν©λλ€.
λλ²κΉ μ κΈλ‘λ² μ»¨ν μ€νΈ
κΈλ‘λ² μ¬μ©μλ₯Ό μν΄ κ°λ°νλ€λ κ²μ μ ν리μΌμ΄μ λμμ μν₯μ λ―ΈμΉ μ μλ λ€μν μμλ₯Ό κ³ λ €νλ κ²μ μλ―Έν©λλ€.
- νκ²½μ λ³ν: μ΄μ 체μ (Windows, macOS, Linux λ°°ν¬ν), Python λ²μ , μ€μΉλ λΌμ΄λΈλ¬λ¦¬ λ° νλμ¨μ΄ ꡬμ±μ μ°¨μ΄λ‘ μΈν΄ λ²κ·Έκ° λ°μνκ±°λ λ ΈμΆλ μ μμ΅λλ€.
- λ°μ΄ν° νμ§ν λ° λ¬Έμ μΈμ½λ©: λ€μν λ¬Έμ μ§ν©κ³Ό μ§μ λ°μ΄ν° νμμ μ¬λ°λ₯΄κ² κ΄λ¦¬νμ§ μμΌλ©΄ μκΈ°μΉ μμ μ€λ₯κ° λ°μν μ μμ΅λλ€.
- λ€νΈμν¬ μ§μ° μκ° λ° μμ μ±: μ격 μλΉμ€ λλ λΆμ° μμ€ν κ³Ό μνΈ μμ©νλ μ ν리μΌμ΄μ μ λ€νΈμν¬ λΆμμ μΌλ‘ μΈν΄ λ°μνλ λ¬Έμ μ μ·¨μ½ν©λλ€.
- λμμ± λ° λ³λ ¬ μ²λ¦¬: λμ μ²λ¦¬λμ μν΄ μ€κ³λ μ ν리μΌμ΄μ μ μ λͺ λκ² λλ²κΉ νκΈ° μ΄λ €μ΄ κ²½μ 쑰건 λλ κ΅μ°© μνμ μ§λ©΄ν μ μμ΅λλ€.
- 리μμ€ μ μ½ μ‘°κ±΄: λ©λͺ¨λ¦¬ λμ λλ CPU μ§μ½μ μΈ μμ κ³Ό κ°μ μ±λ₯ λ¬Έμ λ λ€μν νλμ¨μ΄ κΈ°λ₯μ κ°μ§ μμ€ν μμ λ€λ₯΄κ² λνλ μ μμ΅λλ€.
ν¨κ³Όμ μΈ κ³ κΈ λλ²κΉ κΈ°λ²μ μ§λ¦¬μ μμΉλ νΉμ κ°λ° μ€μ μ κ΄κ³μμ΄ μ΄λ¬ν 볡μ‘ν μλ리μ€λ₯Ό 체κ³μ μΌλ‘ μ‘°μ¬ν μ μλ λꡬμ λ°©λ²λ‘ μ μ 곡ν©λλ€.
Python λ΄μ₯ λλ²κ±°(pdb)μ κ°λ ₯ν κΈ°λ₯ νμ©
Python νμ€ λΌμ΄λΈλ¬λ¦¬μλ pdbλΌλ κ°λ ₯ν λͺ
λ Ήμ€ λλ²κ±°κ° ν¬ν¨λμ΄ μμ΅λλ€. κΈ°λ³Έ μ¬μ©λ²μλ μ€λ¨μ μ μ€μ νκ³ μ½λλ₯Ό λ¨κ³λ³λ‘ μ€ννλ κ²μ΄ ν¬ν¨λμ§λ§, κ³ κΈ κΈ°λ²μ ν΅ν΄ λͺ¨λ μ μ¬λ ₯μ λ°νν μ μμ΅λλ€.
κ³ κΈ pdb λͺ λ Ή λ° κΈ°λ²
- μ‘°κ±΄λΆ μ€λ¨μ : 루νμ λͺ¨λ λ°λ³΅μμ μ€νμ μ€μ§νλ λμ νΉμ μ‘°κ±΄μ΄ μΆ©μ‘±λ λλ§ νΈλ¦¬κ±°λλ μ€λ¨μ μ μ€μ ν μ μμ΅λλ€. μ΄λ μμ² λ²μ λ°λ³΅μ΄ μλ 루νλ₯Ό λλ²κΉ
νκ±°λ λλ¬Έ μ΄λ²€νΈλ₯Ό νν°λ§νλ λ° λ§€μ° μ μ©ν©λλ€.
import pdb def process_data(items): for i, item in enumerate(items): if i == 1000: # Only break at the 1000th item pdb.set_trace() # ... process item ... - μ¬ν λΆμ λλ²κΉ
: νλ‘κ·Έλ¨μ΄ μκΈ°μΉ μκ² μΆ©λν λ
pdb.pm()(λλpdb.post_mortem(traceback_object))μ μ¬μ©νμ¬ μμΈ λ°μ μμ μ λλ²κ±°λ₯Ό μμν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μΆ©λ μμ μ νλ‘κ·Έλ¨ μνλ₯Ό κ²μ¬ν μ μμΌλ©°, μ΄λ μ’ μ’ κ°μ₯ μ€μν μ 보μ λλ€.import pdb import sys try: # ... code that might raise an exception ... except Exception: import traceback traceback.print_exc() pdb.post_mortem(sys.exc_info()[2]) - κ°μ²΄ λ° λ³μ κ²μ¬: λ¨μ λ³μ κ²μ¬λ₯Ό λμ΄
pdbλ₯Ό μ¬μ©νλ©΄ κ°μ²΄ ꡬ쑰λ₯Ό κΉμ΄ νκ³ λ€ μ μμ΅λλ€.p(μΈμ),pp(μμκ² μΈμ) λ°displayμ κ°μ λͺ λ Ήμ΄ νμμ μ λλ€.whatisλ₯Ό μ¬μ©νμ¬ κ°μ²΄μ μ νμ νμΈν μλ μμ΅λλ€. - λλ²κ±° λ΄μμ μ½λ μ€ν:
interactλͺ λ Ήμ μ¬μ©νλ©΄ νμ¬ λλ²κΉ 컨ν μ€νΈ λ΄μμ λνν Python μ Έμ μ΄μ΄ κ°μ€μ ν μ€νΈνκ±°λ λ³μλ₯Ό μ‘°μνκΈ° μν΄ μμμ μ½λλ₯Ό μ€νν μ μμ΅λλ€. - νλ‘λμ
νκ²½μμ λλ²κΉ
(μ£Όμ): λλ²κ±° μ°κ²°μ΄ μνν νλ‘λμ
νκ²½μμ μ€μν λ¬Έμ κ° λ°μνλ κ²½μ° νΉμ μνλ₯Ό λ‘κΉ
νκ±°λ
pdbλ₯Ό μ νμ μΌλ‘ νμ±ννλ κ²κ³Ό κ°μ κΈ°λ²μ μ¬μ©ν μ μμ΅λλ€. κ·Έλ¬λ κ·Ήλμ μ£Όμμ μ μ ν μμ μ₯μΉκ° νμν©λλ€.
ν₯μλ λλ²κ±°(ipdb, pudb)λ‘ pdb κ°ν
λμ± μ¬μ©μ μΉνμ μ΄κ³ κΈ°λ₯μ΄ νλΆν λλ²κΉ κ²½νμ μν΄ ν₯μλ λλ²κ±°λ₯Ό κ³ λ €νμμμ€.
ipdb: IPythonμ κΈ°λ₯μ ν΅ν©νμ¬ ν μμ±, ꡬ문 κ°μ‘° νμ λ° λ λμ λ΄λΆ κ²μ¬ κΈ°λ₯μ μ 곡νλpdbμ ν₯μλ λ²μ μ λλ€.pudb: μμ€ μ½λ κ°μ‘° νμ, λ³μ κ²μ¬ μ°½ λ° νΈμΆ μ€ν 보기μ κ°μ κΈ°λ₯κ³Ό ν¨κ» κ·Έλν½ λλ²κ±°μ μ μ¬ν μ§κ΄μ μΈ μΈν°νμ΄μ€λ₯Ό μ 곡νλ μ½μ κΈ°λ° μκ°μ λλ²κ±°μ λλ€.
μ΄λ¬ν λꡬλ λλ²κΉ μν¬νλ‘λ₯Ό ν¬κ² κ°μ νμ¬ λ³΅μ‘ν μ½λλ² μ΄μ€λ₯Ό νμνκ³ νλ‘κ·Έλ¨ νλ¦μ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
μ€ν μΆμ λ§μ€ν°νκΈ°: κ°λ°μμ μ§λ
μ€ν μΆμ μ μ€λ₯λ‘ μ΄μ΄μ§ ν¨μ νΈμΆ μμλ₯Ό μ΄ν΄νλ λ° μμ΄μλ μ λ λꡬμ λλ€. κ³ κΈ λλ²κΉ μ μ€ν μΆμ μ μ½λ κ²λΏλ§ μλλΌ μ² μ ν ν΄μνλ κ²μ ν¬ν¨ν©λλ€.
볡μ‘ν μ€ν μΆμ ν΄λ
- νλ¦ μ΄ν΄: μ€ν μΆμ μ κ°μ₯ μ΅κ·Ό(μ)μμ κ°μ₯ μ€λλ(μλ) ν¨μ νΈμΆμ λμ΄ν©λλ€. μ€λ₯μ μλ μ§μ κ³Ό κ·Έ μ§μ μ λλ¬νλ λ° μ¬μ©λ κ²½λ‘λ₯Ό μλ³νλ κ²μ΄ μ€μν©λλ€.
- μ€λ₯ μ°ΎκΈ°: μ€ν μΆμ μ 맨 μ νλͺ©μ μΌλ°μ μΌλ‘ μμΈκ° λ°μν μ νν μ½λ μ€μ κ°λ¦¬ν΅λλ€.
- 컨ν μ€νΈ λΆμ: μ€λ₯ μ΄μ μ ν¨μ νΈμΆμ κ²μ¬ν©λλ€. μ΄λ¬ν ν¨μμ μ λ¬λ μΈμμ ν΄λΉ μ§μ λ³μ(λλ²κ±°λ₯Ό ν΅ν΄ μ¬μ© κ°λ₯ν κ²½μ°)λ νλ‘κ·Έλ¨ μνμ λν μ€μν 컨ν μ€νΈλ₯Ό μ 곡ν©λλ€.
- νμ¬ λΌμ΄λΈλ¬λ¦¬ 무μ(κ²½μ°μ λ°λΌ): λ§μ κ²½μ° μ€λ₯κ° νμ¬ λΌμ΄λΈλ¬λ¦¬ λ΄μμ λ°μν μ μμ΅λλ€. λΌμ΄λΈλ¬λ¦¬μ μν μ μ΄ν΄νλ κ²μ΄ μ€μνμ§λ§, λΌμ΄λΈλ¬λ¦¬μ μνΈ μμ©νλ μ체 μ ν리μΌμ΄μ μ½λμ λλ²κΉ λ Έλ ₯μ μ§μ€νμμμ€.
- μ¬κ· νΈμΆ μλ³: κΉκ±°λ 무ν μ¬κ·λ μ€ν μ€λ²νλ‘ μ€λ₯μ μΌλ°μ μΈ μμΈμ λλ€. μ€ν μΆμ μ λ°λ³΅μ μΈ ν¨μ νΈμΆ ν¨ν΄μ 보μ¬μ£Όμ΄ μ¬κ· 루νλ₯Ό λνλΌ μ μμ΅λλ€.
ν₯μλ μ€ν μΆμ λΆμ λꡬ
- μμκ² μΈμ:
richμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μμ μ½λ©κ³Ό λ λμ μμ μ§μ μ ν΅ν΄ μ€ν μΆμ μ κ°λ μ±μ ν¬κ² ν₯μμμΌ νΉν ν° μΆμ μ κ²½μ° λ μ½κ² μ€μΊνκ³ μ΄ν΄ν μ μμ΅λλ€. - λ‘κΉ νλ μμν¬: μ μ ν λ‘κ·Έ μμ€μ κ°μ§ κ°λ ₯ν λ‘κΉ μ μ€λ₯λ‘ μ΄μ΄μ§λ νλ‘κ·Έλ¨ μ€νμ κΈ°λ‘μ μ 곡νμ¬ μ€ν μΆμ μ μ 보λ₯Ό 보μν μ μμ΅λλ€.
λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λ° λλ²κΉ
λ©λͺ¨λ¦¬ λμ λ° κ³Όλν λ©λͺ¨λ¦¬ μλΉλ νΉν μ₯κΈ° μ€ν μλΉμ€ λλ 리μμ€ μ μ½μ΄ μλ μ₯μΉμ λ°°ν¬λ μ ν리μΌμ΄μ μμ μ ν리μΌμ΄μ μ±λ₯μ μ νμν€κ³ λΆμμ μ±μ μ λ°ν μ μμ΅λλ€. κ³ κΈ λλ²κΉ μλ λ©λͺ¨λ¦¬ μ¬μ©λμ μμΈν μ‘°μ¬νλ κ²μ΄ ν¬ν¨λλ κ²½μ°κ° λ§μ΅λλ€.
λ©λͺ¨λ¦¬ λμ μλ³
λ©λͺ¨λ¦¬ λμλ μ ν리μΌμ΄μ μμ λ μ΄μ νμνμ§ μμ§λ§ μ¬μ ν μ°Έμ‘°λκ³ μμ΄ κ°λΉμ§ μμ§κΈ°κ° λ©λͺ¨λ¦¬λ₯Ό νμνμ§ λͺ»νκ² νλ κ²½μ°μ λ°μν©λλ€. μ΄λ‘ μΈν΄ μκ°μ΄ μ§λ¨μ λ°λΌ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ μ§μ μΌλ‘ μ¦κ°ν μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λꡬ:
objgraph: μ΄ λΌμ΄λΈλ¬λ¦¬λ κ°μ²΄ κ·Έλνλ₯Ό μκ°ννλ λ° λμμ΄ λλ―λ‘ μ°Έμ‘° μ£ΌκΈ°λ₯Ό μ½κ² λ°κ²¬νκ³ μκΈ°μΉ μκ² λ³΄μ‘΄λλ κ°μ²΄λ₯Ό μλ³ν μ μμ΅λλ€.memory_profiler: Python μ½λ λ΄μμ μ€ λ¨μλ‘ λ©λͺ¨λ¦¬ μ¬μ©λμ λͺ¨λν°λ§νλ λͺ¨λμ λλ€. κ°μ₯ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλΉνλ μ€μ μ νν μ°ΎμλΌ μ μμ΅λλ€.guppy(λλheapy): νμ κ²μ¬νκ³ κ°μ²΄ ν λΉμ μΆμ νλ κ°λ ₯ν λꡬμ λλ€.
λ©λͺ¨λ¦¬ κ΄λ ¨ λ¬Έμ λλ²κΉ
- κ°μ²΄ μλͺ μΆμ : κ°μ²΄λ₯Ό μμ±νκ³ νκΈ°ν΄μΌ νλ μκΈ°λ₯Ό μ΄ν΄ν©λλ€. λΆνμνκ² κ°μ²΄λ₯Ό μ μ§νμ§ μλλ‘ μ μ ν κ²½μ° μ½ν μ°Έμ‘°λ₯Ό μ¬μ©νμμμ€.
- κ°λΉμ§ μμ§ λΆμ: Pythonμ κ°λΉμ§ μμ§κΈ°λ μΌλ°μ μΌλ‘ ν¨κ³Όμ μ΄μ§λ§ λμμ μ΄ν΄νλ κ²μ΄ λμμ΄ λ μ μμ΅λλ€. λꡬλ κ°λΉμ§ μμ§κΈ°κ° μννλ μμ μ λν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€.
- 리μμ€ κ΄λ¦¬: λ μ΄μ νμνμ§ μμ κ²½μ° νμΌ νΈλ€, λ€νΈμν¬ μ°κ²° λ° λ°μ΄ν°λ² μ΄μ€ μ°κ²°κ³Ό κ°μ 리μμ€κ°
withλ¬Έ λλ λͺ μμ μ 리 λ©μλλ₯Ό μ¬μ©νμ¬ μ μ νκ² λ«νκ±°λ ν΄μ λμλμ§ νμΈνμμμ€.
μ: memory_profilerλ‘ μ μ¬μ μΈ λ©λͺ¨λ¦¬ λμ κ°μ§
from memory_profiler import profile
@profile
def create_large_list():
data = []
for i in range(1000000):
data.append(i * i)
return data
if __name__ == '__main__':
my_list = create_large_list()
# If 'my_list' were global and not reassigned, and the function
# returned it, it could potentially lead to retention.
# More complex leaks involve unintended references in closures or global variables.
python -m memory_profiler your_script.pyλ‘ μ΄ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ©΄ μ€λΉ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ νμλμ΄ λ©λͺ¨λ¦¬κ° ν λΉλλ μμΉλ₯Ό μλ³νλ λ° λμμ΄ λ©λλ€.
μ±λ₯ νλ λ° νλ‘νμΌλ§
λ¨μν λ²κ·Έλ₯Ό μμ νλ κ² μΈμλ κ³ κΈ λλ²κΉ μ μ ν리μΌμ΄μ μ±λ₯ μ΅μ νλ‘ νμ₯λλ κ²½μ°κ° λ§μ΅λλ€. νλ‘νμΌλ§μ λ³λͺ© νμ(μ½λμμ κ°μ₯ λ§μ μκ°μ΄λ 리μμ€λ₯Ό μλΉνλ λΆλΆ)μ μλ³νλ λ° λμμ΄ λ©λλ€.
Pythonμ νλ‘νμΌλ§ λꡬ
cProfile(λ°profile): Pythonμ λ΄μ₯ νλ‘νμΌλ¬μ λλ€.cProfileμ Cλ‘ μμ±λμμΌλ©° μ€λ²ν€λκ° μ μ΅λλ€. ν¨μ νΈμΆ νμ, μ€ν μκ° λ° λμ μκ°μ λν ν΅κ³λ₯Ό μ 곡ν©λλ€.line_profiler: ν¨μ λ΄μμ μκ°μ΄ μμλλ μμΉμ λν λ μΈλΆνλ 보기λ₯Ό μ 곡νλ μ€ λ¨μ νλ‘νμΌλ§μ μ 곡νλ νμ₯μ λλ€.py-spy: Python νλ‘κ·Έλ¨μ© μνλ§ νλ‘νμΌλ¬μ λλ€. μ½λ μμ μμ΄ μ€ν μ€μΈ Python νλ‘μΈμ€μ μ°κ²°ν μ μμΌλ―λ‘ νλ‘λμ λλ 볡μ‘ν μ ν리μΌμ΄μ μ λλ²κΉ νλ λ° νμν©λλ€.scalene: Pythonμ© κ³ μ±λ₯, κ³ μ λ° CPU λ° λ©λͺ¨λ¦¬ νλ‘νμΌλ¬μ λλ€. CPU μ¬μ©λ₯ , λ©λͺ¨λ¦¬ ν λΉ, μ¬μ§μ΄ GPU μ¬μ©λ₯ κΉμ§ κ°μ§ν μ μμ΅λλ€.
νλ‘νμΌλ§ κ²°κ³Ό ν΄μ
- ν«μ€νμ μ§μ€: λΆκ· νμ μΌλ‘ λ§μ μκ°μ μλΉνλ ν¨μ λλ μ½λ μ€μ μλ³ν©λλ€.
- νΈμΆ κ·Έλν λΆμ: ν¨μκ° μλ‘λ₯Ό νΈμΆνλ λ°©λ²κ³Ό μ€ν κ²½λ‘κ° μλΉν μ§μ°μΌλ‘ μ΄μ΄μ§λ μμΉλ₯Ό μ΄ν΄ν©λλ€.
- μκ³ λ¦¬μ¦ λ³΅μ‘μ± κ³ λ €: νλ‘νμΌλ§μ μ’ μ’ λΉν¨μ¨μ μΈ μκ³ λ¦¬μ¦(μ: O(n log n) λλ O(n)μ΄ κ°λ₯ν κ²½μ° O(n^2))μ΄ μ±λ₯ λ¬Έμ μ μ£Όμ μμΈμμ λ°νλ λλ€.
- I/O λ°μ΄λ vs. CPU λ°μ΄λ: μΈλΆ 리μμ€λ₯Ό κΈ°λ€λ¦¬λ λ° μκ°μ΄ μ€λ 걸리λ μμ (I/O λ°μ΄λ)κ³Ό κ³μ° μ§μ½μ μΈ μμ (CPU λ°μ΄λ)μ ꡬλ³ν©λλ€. μ΄λ μ΅μ ν μ λ΅μ κ²°μ ν©λλ€.
μ: cProfileμ μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμ μ°ΎκΈ°
import cProfile
import re
def slow_function():
# Simulate some work
result = 0
for i in range(100000):
result += i
return result
def fast_function():
return 100
def main_logic():
data1 = slow_function()
data2 = fast_function()
# ... more logic
if __name__ == '__main__':
cProfile.run('main_logic()', 'profile_results.prof')
# To view the results:
# python -m pstats profile_results.prof
κ·Έλ¬λ©΄ pstats λͺ¨λμ μ¬μ©νμ¬ profile_results.prof νμΌμ λΆμνμ¬ μ€ννλ λ° κ°μ₯ μ€λ κ±Έλ¦° ν¨μλ₯Ό νμν μ μμ΅λλ€.
λλ²κΉ μ μν ν¨κ³Όμ μΈ λ‘κΉ μ λ΅
λλ²κ±°λ λννμ΄μ§λ§ κ°λ ₯ν λ‘κΉ μ μ ν리μΌμ΄μ μ€ν κΈ°λ‘μ μ 곡νλ―λ‘ νΉν λΆμ° μμ€ν μμ μ¬ν λΆμ λ° μκ° κ²½κ³Όμ λ°λ₯Έ λμ μ΄ν΄μ λ§€μ° μ μ©ν©λλ€.
Python λ‘κΉ μ μν λͺ¨λ² μ¬λ‘
loggingλͺ¨λ μ¬μ©: Pythonμ λ΄μ₯loggingλͺ¨λμ κ΅¬μ± κ°λ₯μ±μ΄ λκ³ κ°λ ₯ν©λλ€. 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° κ°λ¨νprint()λ¬Έμ μ¬μ©νμ§ λ§μμμ€.- λͺ
νν λ‘κ·Έ μμ€ μ μ:
DEBUG,INFO,WARNING,ERRORλ°CRITICALκ³Ό κ°μ μμ€μ μ μ νκ² μ¬μ©νμ¬ λ©μμ§λ₯Ό λΆλ₯ν©λλ€. - ꡬ쑰νλ λ‘κΉ : κ΄λ ¨ λ©νλ°μ΄ν°(νμμ€ν¬ν, μ¬μ©μ ID, μμ² ID, λͺ¨λ μ΄λ¦)μ ν¨κ» ꡬ쑰νλ νμ(μ: JSON)μΌλ‘ λ©μμ§λ₯Ό κΈ°λ‘ν©λλ€. μ΄λ κ² νλ©΄ λ‘κ·Έλ₯Ό μ»΄ν¨ν°μμ μ½μ μ μκ³ μΏΌλ¦¬νκΈ°κ° λ μ¬μμ§λλ€.
- 컨ν μ€νΈ μ 보: λ‘κ·Έ λ©μμ§μ κ΄λ ¨ λ³μ, ν¨μ μ΄λ¦ λ° μ€ν 컨ν μ€νΈλ₯Ό ν¬ν¨ν©λλ€.
- μ€μ μ§μ€μ λ‘κΉ : λΆμ° μμ€ν μ κ²½μ° λͺ¨λ μλΉμ€μ λ‘κ·Έλ₯Ό μ€μ μ§μ€μ λ‘κΉ νλ«νΌ(μ: ELK μ€ν, Splunk, ν΄λΌμ°λ λ€μ΄ν°λΈ μ루μ )μΌλ‘ μ§κ³ν©λλ€.
- λ‘κ·Έ μν λ° λ³΄μ‘΄: κ³Όλν λμ€ν¬ μ¬μ©μ λ°©μ§νκΈ° μν΄ λ‘κ·Έ νμΌ ν¬κΈ° λ° λ³΄μ‘΄ κΈ°κ°μ κ΄λ¦¬νλ μ λ΅μ ꡬνν©λλ€.
κΈλ‘λ² μ ν리μΌμ΄μ λ‘κΉ
μ μμ μΌλ‘ λ°°ν¬λ μ ν리μΌμ΄μ μ λλ²κΉ ν λ:
- νμ€ μκ°λ μΌκ΄μ±: λͺ¨λ λ‘κ·Έκ° μΌκ΄λκ³ λͺ νν νμ€ μκ°λ(μ: UTC)λ‘ νμμ€ν¬νλ₯Ό κΈ°λ‘νλμ§ νμΈν©λλ€. μ΄λ μλ‘ λ€λ₯Έ μλ²μ μ§μμμ μ΄λ²€νΈλ₯Ό μνΈ μ°κ΄μν€λ λ° λ§€μ° μ€μν©λλ€.
- μ§λ¦¬μ 컨ν μ€νΈ: κ΄λ ¨λ κ²½μ° μ§λ¦¬μ μ 보(μ: IP μ£Όμ μμΉ)λ₯Ό κΈ°λ‘νμ¬ μ§μμ λ¬Έμ λ₯Ό νμ ν©λλ€.
- μ±λ₯ λ©νΈλ¦: λ€μν μ§μμ μμ² λκΈ° μκ°, μ€λ₯μ¨ λ° λ¦¬μμ€ μ¬μ©λκ³Ό κ΄λ ¨λ μ£Όμ μ±κ³Ό μ§ν(KPI)λ₯Ό κΈ°λ‘ν©λλ€.
κ³ κΈ λλ²κΉ μλλ¦¬μ€ λ° μ루μ
λμμ± λ° λ€μ€ μ€λ λ© λλ²κΉ
λ€μ€ μ€λ λ λλ λ€μ€ μ²λ¦¬ μ ν리μΌμ΄μ μ λλ²κΉ νλ κ²μ κ²½μ 쑰건 λ° κ΅μ°© μνλ‘ μΈν΄ μ λͺ λκ² μ΄λ ΅μ΅λλ€. λλ²κ±°λ μ’ μ’ μ΄λ¬ν λ¬Έμ μ λΉκ²°μ μ νΉμ±μΌλ‘ μΈν΄ λͺ νν κ·Έλ¦Όμ μ 곡νλ λ° μ΄λ €μμ κ²ͺμ΅λλ€.
- μ€λ λ μμ μ²λ¦¬κΈ°: Python μ체μ λ΄μ₯λμ΄ μμ§λ μμ§λ§ μΈλΆ λꡬλ κΈ°μ μ λ°μ΄ν° κ²½μμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ κΈ λλ²κΉ : μ κΈ λ° λκΈ°ν κΈ°λ³Έ μμμ μ¬μ©μ μ£Όμ κΉκ² κ²μ¬ν©λλ€. μ κΈμ΄ μ¬λ°λ₯΄κ³ μΌκ΄λκ² νλλκ³ ν΄μ λμλμ§ νμΈν©λλ€.
- μ¬ν κ°λ₯ν ν μ€νΈ: νΉν λμμ± μλ리μ€λ₯Ό λμμΌλ‘ νλ λ¨μ ν μ€νΈλ₯Ό μμ±ν©λλ€. λλ‘λ μ§μ°μ μΆκ°νκ±°λ μλμ μΌλ‘ κ²½μμ μμ±νλ©΄ νμ νκΈ° μ΄λ €μ΄ λ²κ·Έλ₯Ό μ¬ννλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ€λ λ ID λ‘κΉ : λ©μμ§μ ν¨κ» μ€λ λ IDλ₯Ό κΈ°λ‘νμ¬ μ΄λ€ μ€λ λκ° μμ μ μννλμ§ κ΅¬λ³ν©λλ€.
threading.local(): λͺ μμ μ κΈ μμ΄ κ° μ€λ λμ νΉμ λ λ°μ΄ν°λ₯Ό κ΄λ¦¬νκΈ° μν΄ μ€λ λ λ‘컬 μ€ν 리μ§λ₯Ό μ¬μ©ν©λλ€.
λ€νΈμν¬ μ ν리μΌμ΄μ λ° API λλ²κΉ
λ€νΈμν¬ μ ν리μΌμ΄μ μ λ¬Έμ λ μ’ μ’ λ€νΈμν¬ λ¬Έμ , μΈλΆ μλΉμ€ μ€ν¨ λλ μλͺ»λ μμ²/μλ΅ μ²λ¦¬μμ λΉλ‘―λ©λλ€.
- Wireshark/tcpdump: λ€νΈμν¬ ν¨ν· λΆμκΈ°λ μμ λ€νΈμν¬ νΈλν½μ μΊ‘μ²νκ³ κ²μ¬ν μ μμΌλ©°, μ μ‘λκ³ μμ λλ λ°μ΄ν°λ₯Ό μ΄ν΄νλ λ° μ μ©ν©λλ€.
- API λͺ¨μ:
unittest.mockμ κ°μ λꡬ λλresponsesμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ ν μ€νΈ μ€μ μΈλΆ API νΈμΆμ λͺ¨μν©λλ€. μ΄λ κ² νλ©΄ μ ν리μΌμ΄μ λ‘μ§μ΄ 격리λκ³ μΈλΆ μλΉμ€μμ μνΈ μμ©μ μ μ΄λ λ°©μμΌλ‘ ν μ€νΈν μ μμ΅λλ€. - μμ²/μλ΅ λ‘κΉ : ν΅μ λ¬Έμ λ₯Ό μ§λ¨νκΈ° μν΄ ν€λμ νμ΄λ‘λλ₯Ό ν¬ν¨νμ¬ μ μ‘λ μμ² λ° μμ λ μλ΅μ λν μΈλΆ μ 보λ₯Ό κΈ°λ‘ν©λλ€.
- μκ° μ΄κ³Ό λ° μ¬μλ: λ€νΈμν¬ μμ²μ λν μ μ ν μκ° μ΄κ³Όμ μΌμμ μΈ λ€νΈμν¬ μ€λ₯μ λν κ°λ ₯ν μ¬μλ λ©μ»€λμ¦μ ꡬνν©λλ€.
- μκ΄ ID: λΆμ° μμ€ν μμ μκ΄ IDλ₯Ό μ¬μ©νμ¬ μ¬λ¬ μλΉμ€μμ λ¨μΌ μμ²μ μΆμ ν©λλ€.
μΈλΆ μ’ μμ± λ° ν΅ν© λλ²κΉ
μ ν리μΌμ΄μ μ΄ μΈλΆ λ°μ΄ν°λ² μ΄μ€, λ©μμ§ ν λλ κΈ°ν μλΉμ€μ μμ‘΄νλ κ²½μ° μ΄λ¬ν μ’ μμ±μ μλͺ»λ κ΅¬μ± λλ μκΈ°μΉ μμ λμμΌλ‘ μΈν΄ λ²κ·Έκ° λ°μν μ μμ΅λλ€.
- μ’ μμ± μν κ²μ¬: μ ν리μΌμ΄μ μ΄ μ’ μμ±μ μ°κ²°νκ³ μνΈ μμ©ν μ μλμ§ νμΈνκΈ° μν΄ κ²μ¬λ₯Ό ꡬνν©λλ€.
- λ°μ΄ν°λ² μ΄μ€ 쿼리 λΆμ: λ°μ΄ν°λ² μ΄μ€λ³ λꡬλ₯Ό μ¬μ©νμ¬ λλ¦° 쿼리λ₯Ό λΆμνκ±°λ μ€ν κ³νμ μ΄ν΄ν©λλ€.
- λ©μμ§ ν λͺ¨λν°λ§: λ°°λ¬λμ§ μμ λ©μμ§, λ°λ λ ν° ν λ° μ²λ¦¬ μ§μ°μ λν΄ λ©μμ§ νλ₯Ό λͺ¨λν°λ§ν©λλ€.
- λ²μ νΈνμ±: μ’ μμ± λ²μ μ΄ Python λ²μ λ° μλ‘ νΈνλλμ§ νμΈν©λλ€.
λλ²κΉ λ§μΈλ ꡬμΆ
λꡬμ κΈ°μ μ λμ΄ μ²΄κ³μ μ΄κ³ λΆμμ μΈ μ¬κ³ λ°©μμ κ°λ°νλ κ²μ΄ ν¨κ³Όμ μΈ λλ²κΉ μ λ§€μ° μ€μν©λλ€.
- λ²κ·Έλ₯Ό μΌκ΄λκ² μ¬ν: λ²κ·Έλ₯Ό ν΄κ²°νλ 첫 λ²μ§Έ λ¨κ³λ μμ μ μΌλ‘ μ¬νν μ μλ κ²μ λλ€.
- κ°μ€ 곡μν: μ¦μμ λ°λΌ λ²κ·Έμ μ μ¬μ μμΈμ λν κ΅μ‘μ μΆμΈ‘μ νμ±ν©λλ€.
- λ¬Έμ 격리: μ½λλ₯Ό λ¨μννκ±°λ κ΅¬μ± μμλ₯Ό λΉνμ±ννκ±°λ μ΅μνμ μ¬ν κ°λ₯ν μμ λ₯Ό λ§λ€μ΄ λ¬Έμ λ²μλ₯Ό μ’νλλ€.
- μμ μ¬ν ν μ€νΈ: μ루μ μ μ² μ ν ν μ€νΈνμ¬ μλ λ²κ·Έλ₯Ό ν΄κ²°νκ³ μλ‘μ΄ λ²κ·Έλ₯Ό λμ νμ§ μλμ§ νμΈν©λλ€. μμ§ μΌμ΄μ€λ₯Ό κ³ λ €νμμμ€.
- λ²κ·Έλ‘λΆν° λ°°μ°κΈ°: λͺ¨λ λ²κ·Έλ μ½λ, μ’ μμ± λ° Pythonμ λ΄λΆ ꡬ쑰μ λν΄ μμΈν λ°°μΈ μ μλ κΈ°νμ λλ€. λ°λ³΅λλ λ¬Έμ μ ν΄κ²° λ°©λ²μ λ¬Έμνν©λλ€.
- ν¨κ³Όμ μΌλ‘ νμ : λ²κ·Έ λ° λλ²κΉ λ Έλ ₯μ λν μ 보λ₯Ό νκ³Ό 곡μ ν©λλ€. νμ΄ λλ²κΉ μ λ§€μ° ν¨κ³Όμ μΌ μ μμ΅λλ€.
κ²°λ‘
κ³ κΈ Python λλ²κΉ μ λ¨μν μ€λ₯λ₯Ό μ°Ύκ³ μμ νλ κ²μ΄ μλλΌ λ³΅μλ ₯μ ꡬμΆνκ³ μ ν리μΌμ΄μ λμμ κΉμ΄ μ΄ν΄νκ³ μ΅μ μ μ±λ₯μ 보μ₯νλ κ²μ λλ€. κ³ κΈ λλ²κ±° μ¬μ©λ², μ² μ ν μ€ν μΆμ λΆμ, λ©λͺ¨λ¦¬ νλ‘νμΌλ§, μ±λ₯ νλ λ° μ λ΅μ λ‘κΉ κ³Ό κ°μ κΈ°μ μ λ§μ€ν°ν¨μΌλ‘μ¨ μ μΈκ³ κ°λ°μλ κ°μ₯ 볡μ‘ν λ¬Έμ ν΄κ²° κ³Όμ μ‘°μ°¨ ν΄κ²°ν μ μμ΅λλ€. μ΄λ¬ν λꡬμ λ°©λ²λ‘ μ μ¬μ©νμ¬ λ κΉ¨λνκ³ κ°λ ₯νλ©° ν¨μ¨μ μΈ Python μ½λλ₯Ό μμ±νμ¬ μ ν리μΌμ΄μ μ΄ λ€μνκ³ κΉλ€λ‘μ΄ κΈλ‘λ² νκ²½μμ λ²μ±νλλ‘νμμμ€.